﻿
namespace ProjectenArtesis.Web
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Data;
    using System.Linq;
    using System.ServiceModel.DomainServices.EntityFramework;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;
    using ProjectenArtesis.Web;

    // Also consider adding roles to restrict access as appropriate.
    // [RequiresAuthentication]
    [EnableClientAccess()]
    public class ArtesisDomainService : LinqToEntitiesDomainService<STUDINFORDATEntities>
    {

        #region Zelfgecreëerde queries

        public IQueryable GetDepartment()
        {
            return from dep in ObjectContext.SA_Departement
                   select dep.departement;
        }

        public IQueryable<SA_BamaType> GetBamaTypes(String schooljaar)
        {
            return (from bamatypes in ObjectContext.SA_BamaType
                   join opl in ObjectContext.SA_Opleiding on bamatypes.p_bamatype equals opl.p_bamatype
                   where opl.schooljaar.Equals(schooljaar)
                   select bamatypes).Distinct();
        }

        public IQueryable<SA_Schooljaar> GetSchooljaren()
        {
            var resultaten =  from schooljaar in ObjectContext.SA_Schooljaar
                             where schooljaar.BaMaFlex.Value.Equals(1)
                             select schooljaar;
            List<SA_Schooljaar> schooljaren = new List<SA_Schooljaar>();
            foreach (var resultaat in resultaten)
            {
                if (int.Parse(resultaat.schooljaar.Substring(0, 4)) >= (DateTime.Now.Year - 2))
                    schooljaren.Add(resultaat);
            }
            return schooljaren.AsQueryable();
        }

        public IQueryable<SA_Opleiding> GetOpleidingen(String schooljaar, int bamatype)
        {
            return from opleiding in ObjectContext.SA_Opleiding
                   where (opleiding.p_bamatype.Equals(bamatype)
                       && opleiding.schooljaar.Equals(schooljaar))
                   select opleiding;
        }
        public IQueryable<SA_Opleiding> GetOpleidingenBySchooljaar(String schooljaar)
        {
            return from opleiding in ObjectContext.SA_Opleiding
                   where opleiding.schooljaar.Equals(schooljaar)
                   select opleiding;
        }

        public IQueryable<SA_OpleidingTraject> GetOpleidingTrajecten(int p_opleiding)
        {
            return from traject in ObjectContext.SA_OpleidingTraject
                   where traject.p_opleiding.Value.Equals(p_opleiding)
                   select traject;                   
        }

        public IQueryable<SA_DeelTraject> GetDeeltrajecten(int p_opltraject)
        {
            return from deeltrajecten in ObjectContext.SA_DeelTraject
                   where deeltrajecten.p_opltraject.Value.Equals(p_opltraject)
                   select deeltrajecten;
        }
        
        public IQueryable<Item> GetOLODS(int p_deeltraject,int p_opleiding)
        {
            // alle id's van OLODs ophalen uit een deeltraject
            var ids_oplprog = from deeltrajectprogramma in ObjectContext.SA_DeelTrajectProgramma
                              where deeltrajectprogramma.p_deeltraject.Value.Equals(p_deeltraject)
                              select deeltrajectprogramma.p_oplprog;

            // alle id's van programmaonderdeelID ophalen (zodat daarmee de reële namen opgehaald kunnen worden)
            var ids_progondID = from opleidingsprogramma in ObjectContext.SA_OpleidingsProgramma
                                where ids_oplprog.Contains(opleidingsprogramma.p_oplprog)
                                select opleidingsprogramma.p_progondID;

            // benodigde info uit de OLODs opgehaald
            var resultaten = (from programmaonderdeel in ObjectContext.SA_ProgrammaonderdeelID
                       join opleidingsprog in ObjectContext.SA_OpleidingsProgramma on programmaonderdeel.p_progondID equals opleidingsprog.p_progondID
                       where ids_progondID.Contains(programmaonderdeel.p_progondID) && programmaonderdeel.progondIDactief.Equals(1)
                       && (opleidingsprog.p_opleiding.Value.Equals(p_opleiding))
                       select new { opleidingsprog.p_oplprog, programmaonderdeel.programmaonderdeelID, opleidingsprog.p_parentoplprog,opleidingsprog.studiepunten}).ToList();

            List<Item> items = new List<Item>();
            foreach (var resultaat in resultaten)
            {
                items.Add(new Item(resultaat.p_oplprog, resultaat.programmaonderdeelID, resultaat.p_parentoplprog, (int?)resultaat.studiepunten));
            }

            return items.AsQueryable();
        }

        #endregion

        
        #region Auto-generated stuff
        public IQueryable<SA_DeelTrajectProgramma> GetSA_DeelTrajectProgramma()
        {
            return this.ObjectContext.SA_DeelTrajectProgramma;
        }

        public IQueryable<SA_Departement> GetSA_Departement()
        {
            return this.ObjectContext.SA_Departement;
        }

        public IQueryable<SA_Opleiding> GetSA_Opleiding()
        {
            return this.ObjectContext.SA_Opleiding;
        }

        public IQueryable<SA_OpleidingID> GetSA_OpleidingID()
        {
            return this.ObjectContext.SA_OpleidingID;
        }

        public IQueryable<SA_OpleidingsProgramma> GetSA_OpleidingsProgramma()
        {
            return this.ObjectContext.SA_OpleidingsProgramma;
        }

        public IQueryable<SA_Schooljaar> GetSA_Schooljaar()
        {
            return this.ObjectContext.SA_Schooljaar;
        }

        public IQueryable<SA_Structuur> GetSA_Structuur()
        {
            return this.ObjectContext.SA_Structuur;
        }

        public IQueryable<SA_BamaType> GetSA_Bamatype()
        {
            return this.ObjectContext.SA_BamaType;
        }

        public IQueryable<SA_DeelTraject> GetSA_Deeltraject()
        {
            return this.ObjectContext.SA_DeelTraject;
        }

        public IQueryable<SA_OpleidingTraject> GetSA_OpleidingTraject()
        {
            return this.ObjectContext.SA_OpleidingTraject;
        }

        public IQueryable<SA_ProgrammaonderdeelID> GetSA_ProgrammaonderdeelID()
        {
            return this.ObjectContext.SA_ProgrammaonderdeelID;
        }

        #endregion 

    }
}